Hier noch eine kurze Einführung in den GDB, dem Debugger, der euch dabei helfen wird,
Fehler in eurem Programm zu identifizieren.
Einmal ganz grob gesagt ist ein Debugger ein Programm, das euch dabei hilft, Fehler in
eurem Programm zu finden, indem ihr den Zustand des Prozesses einfrieren und analysieren könnt.
Ein Debugger lässt dabei zu, dass ihr ein Programm zum Beispiel schrittweise abarbeitet.
Das bedeutet zum Beispiel Quellkodzeile für Quellkodzeile, dass ihr euch anschaut, welchen
Inhalt verschiedene Variablen und Speicheradressen haben und dass ihr diese sogar modifizieren
könnt.
Wenn ein Programm abstürzt, kann man auch einstellen, dass es einen sogenannten Core-Dump
erstellt, dass es ein Speicherbild des Prozesses zu dem Zeitpunkt, als ein Fehler aufgetreten
ist und es abgestürzt ist.
Diese Core-Dumps lassen sich ebenfalls mit einem Debugger analysieren.
Damit solche Core-Dumps angelegt werden, müsste dies zunächst mit Limit in der Shell erlauben.
Um ein Programm, das hier ausführt, sinnvoll zu debuggen, sollten während der Übersetzung
folgende Optionen gesetzt werden.
Wir haben auf der einen Seite das Flag binnenstrich g, mit dem man den Übersetzer dazu anweist,
Debug-Symbole in das Binary zu schreiben.
Die Zugang-Symbole sind zum Beispiel die Übersetzung von Quellquotzeile auf Instruktion, damit
dort eine Zuordnung besteht.
Mit Option binstrich groß o null kann der Übersetzer angewiesen werden, zu wenig wie
möglich zu optimieren.
Das macht es einfacher, ein Programm zu debuggen, weil die tatsächliche Programmausführung
dann näher am Quelltext ist.
Sonst kann es vorkommen, dass der Übersetzer Teile des Programms zum Beispiel weglässt,
wenn er merkt, dass etwas nicht ausgeführt wird.
Dabei muss jedoch beachtet werden, dass mit der Option binstrich groß o das Laufzeitverhalten
beeinflusst werden kann.
Das bedeutet, dass wenn ihr euer Programm normal kompiliert, vielleicht ein Fehler
auftritt.
Wenn ihr das Programm jedoch mit binstrich groß o null kompiliert, der Fehler nicht
mehr auftritt.
In sp verwenden wir den Debugger gdb.
Den könnt ihr ganz einfach verwenden, indem ihr gdb aufruft und als Argument das Programm
angibt, das ihr debuggen wollt.
Der gdb ist dabei rein textbasiert.
Eine halbwegs grafische Oberfläche könnt ihr öffnen, indem ihr cgdb verwendet.
An dieser Stelle wollen wir euch eine kurze praktische Demo mit gdb zeigen.
Wir haben auf der linken Seite eine Quelltext-Datei example.c offen.
Diese möchte ich jetzt kompilieren.
Dazu kann ich zum Beispiel folgendes Make-File verwenden.
Mit make example kann ich nun das Programm kompilieren.
Was dabei auffällt ist, dass ich in den C-Flex die Option binstrich klein g und binstrich
groß o null angegeben habe.
Wenn ich nun versuche das Programm auszuführen, werde ich ein Segmentation-Fault bekommen.
Nun wollen wir die Ursache des Segmentation-Faults suchen und beheben.
Dazu schauen wir nochmal in den Quelltext und werden feststellen, dass wir ohne weiteres
keinen Anhaltspunkt haben, wo wir den Fehler suchen müssen.
Die eine Option die wir haben ist, dass wir den Speicherfehler versuchen mit wallgrind
zu finden.
Dazu kann ich ganz einfach wallgrind mit dem Programm example ausführen.
Zugänglich über
Offener Zugang
Dauer
00:15:00 Min
Aufnahmedatum
2020-05-24
Hochgeladen am
2020-05-25 19:46:24
Sprache
de-DE